from langchain.agents import initialize_agent, Tool
from langchain.chat_models import ChatOpenAI
import openai, os
from langchain.agents import tool
import FAQ

os.environ["OPENAI_API_KEY"] = "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"
openai.api_key = os.environ.get("OPENAI_API_KEY")
llm = ChatOpenAI(model_name='gpt-3.5-turbo',max_tokens=2048, temperature=0.5)

# https://blog.csdn.net/dfBeautifulLive/article/details/133353827?spm=1001.2014.3001.5501

# 模拟问关于订单
def search_order(input: str) -> str:
    return "订单状态：已发货；发货日期：2023-09-15；预计送达时间：2023-09-18"


# 模拟问关于推荐产品
def recommend_product(input: str) -> str:
    return "红色连衣裙"


# 模拟问电商faq
def faq(input: str) -> str:
    return "7天无理由退货"


# Python 的 decorator 功能，相当于用了tool的函数功能
@tool("FAQ")
def faq(input: str) -> str:
    """"useful for when you need to answer questions about shopping policies, like return policy, shipping policy, etc."""
    return FAQ.faq_chain.run(input)


# 创建了一个 Tool 对象的数组，把这三个函数分别封装在了三个 Tool 对象里面
# 并且定义了描述，这个 description 就是告诉 AI，这个 Tool 是干什么用的，会根据描述做出选择
tools = [
    Tool(
        name="Search Order", func=search_order,
        description="useful for when you need to answer questions about customers orders"
    ),
    Tool(
        name="Recommend Product", func=recommend_product,
        description="useful for when you need to answer questions about product recommendations"
    ),
    Tool(
        name="FAQ", func=faq,
        description="useful for when you need to answer questions about shopping policies, like return policy, shipping policy, etc."
    ),
    faq
]
# 指定使用tools，llm，agent则是zero-shot"零样本分类"，不给案例自己推理
# max_iterations=2 限制重试次数
# 而 react description，指的是根据你对于 Tool 的描述（description）进行推理（Reasoning）并采取行动（Action）
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", max_iterations=2, verbose=True)

# question = "我想买一件衣服，但是不知道哪个款式好看，你能帮我推荐一下吗？"
# result = agent.run(question)
# print(result)

########## 结果 ################

# > Entering new AgentExecutor chain...
# The customer is asking for a product recommendation.
# Action: Recommend Product
# Action Input: None
# Observation: 红色连衣裙
# Thought:The recommended product is a red dress.
# Final Answer: 推荐给你一件红色连衣裙。
#
# > Finished chain.
# 推荐给你一件红色连衣裙。

########## 分析 ################

# Action：就是根据用户的输入，选用哪个Tool，然后行动
# Action Input：根据需要使用的Tool，从用户的输入里提取相关的内容，可以输入到Tool里面
# Observation：就是观察通过使用 Tool 得到的一个输出结果。
# Thought：就是再看一眼用户的输入，判断一下该怎么做。
# Final Answer：就是 Thought 在看到 Obersavation 之后，给出的最终输出。

#
# question = "我有一张订单，订单号是 2022ABCDE，一直没有收到，能麻烦帮我查一下吗？"
# result = agent.run(question)
# print(result)


question = "请问你们的货，能送到三亚吗？大概需要几天？"
result = agent.run(question)
print(result)

